# Specifické příkazy pro prostředí Google Colab
if 'google.colab' in str(get_ipython()):
import os, sys
os.chdir('/content')
# Stažení knihovny
! ls parlamentikon || git clone "https://github.com/parlamentikon/parlamentikon.git" --branch main
os.chdir('/content/parlamentikon/notebooks')
instalace_zavislosti = True
if instalace_zavislosti:
! pip install -r ../requirements.txt 1>/dev/null
instalace_knihovny = False
if instalace_knihovny:
! pip install .. 1>/dev/null
else:
# Přidání cesty pro lokální import knihovny
import sys, os
sys.path.insert(0, os.path.abspath('..'))
from datetime import datetime
import plotly.graph_objects as go
import pandas as pd
import numpy as np
from parlamentikon.Hlasovani import Hlasovani, ZpochybneniHlasovani
from nastav_notebook import nastav_pandas
# Data se budou pokaždé znovu stahovat z achivu PS
stahni=True
# Budeme analyzovat poslední volební období
zvolene_volebni_obdobi = None
# Načti souhrnné informace o hlasováních
h = Hlasovani(stahni=stahni, volebni_obdobi=zvolene_volebni_obdobi)
h.head(2)
2021-03-23:21:23:05 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/poslanci.zip'. 2021-03-23:21:23:07 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/hl-2017ps.zip'.
| id_hlasovani | id_organ | schuze | cislo | bod | cas | pro | proti | zdrzel | nehlasoval | ... | nazev_kratky | datum | bod__KAT | vysledek | druh_hlasovani | ma_zpochybneni | je_zmatecne | ma_stenozaznam | turn | typ | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 67018 | 172 | 1 | 1 | 3 | 13:53:00 | 191 | 0 | 5 | 0 | ... | <NA> | 2017-11-20 13:53:00+01:00 | normální | přijato | normální | False | True | False | <NA> | <NA> |
| 1 | 67019 | 172 | 1 | 2 | 3 | 13:53:00 | 194 | 0 | 4 | 0 | ... | <NA> | 2017-11-20 13:53:00+01:00 | normální | přijato | normální | False | False | False | <NA> | <NA> |
2 rows × 23 columns
# Načti informace o zpochybnění hlasování
zph = ZpochybneniHlasovani(stahni=stahni, volebni_obdobi=zvolene_volebni_obdobi)
zph.head(2)
2021-03-23:21:23:10 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/poslanci.zip'. 2021-03-23:21:23:11 INFO [utility.py:21] Stahuji 'https://www.psp.cz/eknih/cdrom/opendata/hl-2017ps.zip'. 2021-03-23:21:23:15 WARNING [Snemovna.py:149] While merging 'zpochybneni' with 'hlasovani': Dropping ['turn__hlasovani'] because of abundance. 2021-03-23:21:23:15 WARNING [Snemovna.py:184] Pro sloupec 'je_platne' nebyla nalezena metadata!
| id_hlasovani | turn | mode | id_h2 | id_h3 | mode__KAT | je_platne | id_organ | schuze | cislo | ... | nazev_kratky | datum | bod__KAT | vysledek | druh_hlasovani | ma_zpochybneni | je_zmatecne | ma_stenozaznam | typ__ORIG | typ | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 55680 | 67 | 0 | 55681 | 55682 | žádost o opakování | True | <NA> | <NA> | <NA> | ... | <NA> | NaT | <NA> | <NA> | <NA> | NaN | NaN | NaN | <NA> | <NA> |
| 1 | 55664 | 43 | 0 | 55665 | 55666 | žádost o opakování | True | <NA> | <NA> | <NA> | ... | <NA> | NaT | <NA> | <NA> | <NA> | NaN | NaN | NaN | <NA> | <NA> |
2 rows × 32 columns
volebni_obdobi = h.volebni_obdobi
print(f"Poslanecká sněmovna bude analyzovaná pro volební období {volebni_obdobi}.")
Poslanecká sněmovna bude analyzovaná pro volební období 2017.
def flatten(ary):
return [x for l in ary for x in l]
# Hlasování o zpochybnění hlasování je možné také zkazit nebo zpochybnit.
# Mezi prvním hlasováním o zpochybnění a opakovaným hlasováním může proběhnout několik dalších zpochybněných nebo neplatných hlasování.
def fce_mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovanim_ids(row):
if pd.isna(row['id_h2']):
return []
elif pd.isna(row['id_h3']):
return []
else:
return list(range(row['id_h2']+1, row['id_h3']))
zpochybneni = zph[zph.je_platne == True]
mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovani_ids = \
flatten(zpochybneni[zpochybneni.mode__KAT == 'žádost o opakování'].apply(fce_mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovanim_ids, axis=1))
hlasovani_o_zpochybneni_ids = h[h.id_hlasovani.isin(zpochybneni.id_h2.unique())]
hlasovani_bez_zmatecnych_a_zpochybnenych = h[~h.je_zmatecne
& ~h.id_hlasovani.isin(zph[zph.mode__KAT == 'žádost o opakování'].id_hlasovani)
& ~h.id_hlasovani.isin(mezi_hlasovanim_o_zpochybneni_a_opakovanym_hlasovani_ids)
& ~h.id_hlasovani.isin(hlasovani_o_zpochybneni_ids)
]
h_platne = hlasovani_bez_zmatecnych_a_zpochybnenych.copy()
h_platne["mira_jednomyslnosti"] = (h_platne.pro - h_platne.proti).abs() / (h_platne.pro + h_platne.proti)
h_platne["mira_jednomyslnosti"].describe()
fig = go.Figure(go.Histogram(
x=h_platne.mira_jednomyslnosti,
hovertemplate="míra jednomyslnosti: %{x}<br>počet hlasování: %{y}<extra></extra>"))
fig.update_layout(width=700, height=400, xaxis=dict(title="míra jednomyslnosti"), yaxis=dict(title="počet hlasování"))
fig.show()
# denní míra jednomyslnosti
precision = 3
def A_razeno_dle_B(x, A, B):
df = x.groupby(A)[B].mean().sort_values(ascending=True)
return("<br>".join(map(str, df.index.astype(str) + ': ' + df.values.round(precision).astype(str))))
days = 7
interval = f"{days}D"
df = pd.DataFrame()
df['mira_jednomyslnosti_za_den_mean'] = h_platne.groupby(h_platne.datum.dt.date).mira_jednomyslnosti.mean()
df['nazev_dlouhy_za_den'] = h_platne.groupby(h_platne.datum.dt.date)[['nazev_dlouhy', 'mira_jednomyslnosti']].apply(
lambda x: A_razeno_dle_B(x, "nazev_dlouhy", "mira_jednomyslnosti")
)
df.index = pd.to_datetime(df.index)
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df.index,
y=df.mira_jednomyslnosti_za_den_mean,
text=df.nazev_dlouhy_za_den,
name="míra jednomyslnosti za den",
mode="markers",
marker=dict(
size=5,
color=df.mira_jednomyslnosti_za_den_mean,
colorscale='RdYlGn', # one of plotly colorscales
showscale=True
),
hovertemplate =
'<b>%{x}</b>'+
'<br><br><b>Průměrná míra jednomyslnosti</b>: <i>%{y:.3f}</i>'+
'<br><br><b>Hlasování dle míry jednomyslnosti (vzestupně):</b><br>%{text}<extra></extra>',
hoverlabel=dict(
bgcolor='white',
font=dict(color='black')
)
))
fig.update_layout(title="Denní míra jednomyslnosti", xaxis=dict(title="datum [jednotlivé dny]"), yaxis=dict(title="míra jednomyslnosti"))
fig.show()
print(f"Jednomyslně schválená hlasování (vysoká míra jednomyslnosti): {h_platne[h_platne.mira_jednomyslnosti == 1].index.size}")
jednomyslna_temata = h_platne[h_platne.mira_jednomyslnosti == 1].groupby('nazev_dlouhy').size().sort_values(ascending=False)
print(jednomyslna_temata.head(20))
Jednomyslně schválená hlasování (vysoká míra jednomyslnosti): 3007
nazev_dlouhy
Pořad schůze 518
121
Návrh na vyslovení souhlasu PS s prodloužením doby nouzového stavu 68
Návrh na změny ve složení orgánů Poslanecké sněmovny 59
Návrhy PS na propůjčení nebo udělení státních vyznamenání 44
Vl.n.z. v souv.s elektronizací postupů orgánů veřejné moci 33
Novela z. - školský zákon 26
Návrhy Poslanecké sněmovny na propůjčení nebo udělení státních vyzname 24
Novela z. - trestní řád 23
Novela z. o daních z příjmů 23
Novela z. o kompenzačním bonusu 23
Novela z. o státním rozpočtu ČR na rok 2020 22
Vl. n. z. kterým se mění některé zákony v oblasti daní - EU 20
Vl.n.z. o evidenci skutečných majitelů - EU 18
Usn.PS.1162 18
Novela z. - trestní zákoník - EU 17
Novela ústav. z. - Ústava ČR 16
Náv. na ustavení výborů PS 16
Novela z. o urychlení výstavby dopravní infrastruktury 16
Novela z. o pomoci v hmotné nouzi 16
dtype: int64
print(f"Hlasování s nízkou mírou jednomyslnosti (zcela vyrovnané pro a proti)): {h_platne[h_platne.mira_jednomyslnosti == 0].index.size}")
nejednomyslna_temata = h_platne[h_platne.mira_jednomyslnosti == 0].groupby('nazev_dlouhy').size().sort_values(ascending=False)
print(nejednomyslna_temata.head(20))
Hlasování s nízkou mírou jednomyslnosti (zcela vyrovnané pro a proti)): 71 nazev_dlouhy Novela z. o evidenci tržeb - EU 28 Pořad schůze 7 Vl.n.z. o kompenzačním bonusu v souv. s krizovými opatřeními 5 Vl.n.z.o opatř.ke zmírnění dopadů SARS CoV-2 na nájemce byt. 2 Návrh na vyslovení nedůvěry vládě České republiky 2 Novela z. o rozpočtových pravidlech 2 Vl.n.z. o státním rozpočtu ČR na rok 2021 2 Novela z. - horní zákon 2 Novela z. o důchodovém pojištění 1 Novela z. o evidenci tržeb 1 Novela z. o státním občanství ČR 1 Novela z. o některých úpravách v oblasti evidence tržeb 1 Novela z. o bankách - EU 1 Novela z. o pomoci v hmotné nouzi 1 N.z., kterým se mění zák. opatření Senátu č. 340/2013 Sb. 1 Novela z. o potravinách a tabákových výrobcích - EU 1 Vln. z. o kompenzačním bonusu pro rok 2021 1 Novela z. o ČNB 1 Novela z. o vnitrozemské plavbě - EU 1 Novela z. o vodách (vodní zákon) - EU 1 dtype: int64
# Témata hlasování s nejvyšší mírou jednomyslnosti a jejich počty
cnt = 5
x = pd.DataFrame()
x['celkovy_pocet_hlasovani_dle_tematu'] = h_platne.groupby('nazev_dlouhy').size()
x['prumerna_mira_jednomyslnosti_dle_tematu'] = h_platne.groupby('nazev_dlouhy')['mira_jednomyslnosti'].mean()
x.sort_values(by='prumerna_mira_jednomyslnosti_dle_tematu', ascending=False).head(cnt)
| celkovy_pocet_hlasovani_dle_tematu | prumerna_mira_jednomyslnosti_dle_tematu | |
|---|---|---|
| nazev_dlouhy | ||
| Výroční zpráva o činnosti České televize v roce 2018 | 1 | 1.0 |
| Sml. mezi ČR a Běloruskem o důchodovém zabezpečení | 2 | 1.0 |
| Výroční zpráva a účetní závěrka SFRB za rok 2016 | 1 | 1.0 |
| Sml.mezi ČR a vl.Rep.Kazachstán o spol.v boji proti tr.činn. | 2 | 1.0 |
| Návrh Pravidel hospodaření poslaneckých klubů pro rok 2018 | 1 | 1.0 |
# Témata hlasování s nízkou mírou jednomyslnosti a jejich počty
cnt = 5
x = pd.DataFrame()
x['celkovy_pocet_hlasovani_dle_tematu'] = h_platne.groupby('nazev_dlouhy').size()
x['prumerna_mira_jednomyslnosti_dle_tematu'] = h_platne.groupby('nazev_dlouhy')['mira_jednomyslnosti'].mean()
x.sort_values(by='prumerna_mira_jednomyslnosti_dle_tematu', ascending=False).tail(cnt)
| celkovy_pocet_hlasovani_dle_tematu | prumerna_mira_jednomyslnosti_dle_tematu | |
|---|---|---|
| nazev_dlouhy | ||
| Písemná interpelace V. Munzara na A. Schillerovou | 1 | 0.083333 |
| Novela z. o evidenci tržeb - EU | 857 | 0.060626 |
| Písemná interpelace V. Munzara na A. Schillerovou ve věci poruš. ústav | 1 | 0.054054 |
| Písemná interpelace V. Munzara na A. Schillerovou ve věci odměňování ú | 1 | 0.038961 |
| Návrh na vyslovení nedůvěry vládě České republiky | 3 | 0.022556 |
print(f"Poslední běh notebooku: {datetime.now().strftime('%d.%m.%Y %H:%M:%S')}.")
Poslední běh notebooku: 23.03.2021 21:23:16.